package com.lty.util;

import cn.hutool.core.util.StrUtil;
import com.lty.model.dto.code.ApiInfoDTO;
import com.lty.model.vo.ApiInfoVO;
import org.openapi4j.parser.OpenApi3Parser;
import org.openapi4j.parser.model.v3.OpenApi3;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class ApiInfoUtil {

    /**
     * 获取接口信息列表
     */
    public static List<ApiInfoVO> getApiInfoList(ApiInfoDTO dto) throws Exception {
        List<ApiInfoVO> apiInfoList = new ArrayList<>();
        String apiUrl = dto.getApiUrl();  // 接口地址
        String baseUrl = dto.getBaseUrl();  // 接口前缀,如/api
        String requestMapping = dto.getRequestMapping();  //过滤出requestMapping开头的接口
        // 解析远程 OpenAPI 文档
        OpenApi3 api = new OpenApi3Parser().parse(new URL(apiUrl), false);
        api.getPaths().forEach((path, pathItem) -> {
            // 过滤掉不是以 requestMapping 开头的接口
            if (StrUtil.isNotBlank(requestMapping) && !path.startsWith(baseUrl + requestMapping)) {
                return;
            }
            String apiPath = path.replace(baseUrl, "");
            pathItem.getOperations().forEach((httpMethod, operation) -> {
                ApiInfoVO apiInfo = new ApiInfoVO();
                apiInfo.setPath(apiPath);
                apiInfo.setMethod(httpMethod);
                apiInfo.setName(operation.getOperationId());
                apiInfo.setDescription(StrUtil.isNotBlank(operation.getSummary()) ? operation.getSummary() : "接口描述");
                apiInfoList.add(apiInfo);
            });
        });
        return apiInfoList;
    }
}
